package org.example.springboot3.controller;

import cn.hutool.core.io.FileUtil;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.example.springboot3.common.Result;
import org.example.springboot3.exception.CustomException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/files")
public class FileController{
    /**
     * 文件上传
     */
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file) throws Exception {// 接收名为 "file" 的文件上传参数，可能会抛出异常，MultipartFile 类型用于接收上传的文件
        // System.getProperty("user.dir") 获取当前 Java 程序的工作目录，通常是项目的根目录
        // 拼接文件存储目录，将文件存储在项目根目录下的 files 文件夹中
        String filePath = System.getProperty("user.dir") + "/files/";
        if (!FileUtil.isDirectory(filePath)) {
            FileUtil.mkdir(filePath);
        }
        // FileUtil.isDirectory 方法检查指定路径是否为一个已存在的目录
        // 如果该目录不存在，则使用 FileUtil.mkdir 方法创建该目录
        // MultipartFile.getBytes() 方法将上传的文件内容转换为字节数组
        byte[] bytes = file.getBytes();
        String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();
        // 文件的原始名称
        // 为了避免文件名冲突，使用当前时间戳（System.currentTimeMillis()）加上原始文件名来生成新的文件名

        // 写入文件
        FileUtil.writeBytes(bytes, filePath + fileName);
        String url = "http://localhost:9090/files/download/" + fileName;
        // 生成文件下载的 URL
        // 客户端可以通过该 URL 下载上传的文件
        return Result.success(url);
        // 调用自定义的 Result 类的 success 方法，将文件下载 URL 作为数据封装到响应结果中并返回
    }

    /**
     * 文件下载
     */
        @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) throws Exception {
            // @PathVariable 注解用于从 URL 路径中提取变量值，这里将路径中的 {fileName} 赋值给方法参数 fileName
            // HttpServletResponse 对象用于封装 HTTP 响应信息，通过它可以向客户端发送文件内容
            // 方法声明中抛出 Exception，意味着该方法可能会抛出各种异常，调用者需要进行处理
        String filePath = System.getProperty("user.dir") + "/files/";  // 同样获取项目的工作目录，并拼接文件存储目录
        String realPath = filePath + fileName;  // 拼接完整的文件路径，即要下载的文件的实际存储路径
        boolean exist = FileUtil.exist(realPath); // FileUtil.exist 方法检查指定路径的文件是否存在
        if (!exist) {
            throw new CustomException("500","文件不存在");
        }
        // 读取文件的字节流
        byte[] bytes = FileUtil.readBytes(realPath); // FileUtil.readBytes 方法读取指定路径文件的内容并转换为字节数组
        ServletOutputStream os = response.getOutputStream(); // 通过 HttpServletResponse 对象获取响应的输出流，用于向客户端发送文件内容
        // 输出流对象把文件写出到客户端 // 将文件的字节数组写入响应输出流，发送给客户端
        os.write(bytes);  // 刷新输出流，确保所有数据都被发送到客户端
        os.flush(); // 关闭输出流，释放资源
        os.close();
    }
    /**
     * wang-editor编辑器文件上传接口
     */
    @PostMapping("/wang/upload")
    public Map<String, Object> wangEditorUpload(MultipartFile file) {
        String filePath = System.getProperty("user.dir") + "/files/";
        String originalFilename = file.getOriginalFilename();
        if (!FileUtil.isDirectory(filePath)) {
            FileUtil.mkdir(filePath);  // 创建一个 files 目录
        }
        String fileName = System.currentTimeMillis() + "_" + originalFilename;  // 156723232322_xxx.png
        String realPath = filePath + fileName;   // 完整的文件路径
        try {
            FileUtil.writeBytes(file.getBytes(), realPath);
        } catch (IOException e) {
            e.printStackTrace();
            throw new CustomException("500", "文件上传失败");
        }
        String url = "http://localhost:9090/files/download/" + fileName;
        // wangEditor上传图片成功后， 需要返回的参数
        Map<String, Object> resMap = new HashMap<>();
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> urlMap = new HashMap<>();
        urlMap.put("url", url);
        list.add(urlMap);
        resMap.put("errno", 0);
        resMap.put("data", list);
        return resMap;
    }

}//

